/*
 * @lc app=leetcode.cn id=697 lang=cpp
 *
 * [697] 数组的度
 */

#include <iostream>
#include <map>
#include <set>
#include <vector>
using namespace std;

// @lc code=start
class Solution {
   public:
    int findShortestSubArray(vector<int>& nums) {
        int counter[50000];
        int start[50000];
        int end[50000];
        int maxCount = 0;
        set<int> maxNumber;

        // 初始化相关数组
        for (int i = 0; i < 50000; i++) {
            counter[i] = 0;
            start[i] = -1;
            end[i] = -1;
        }

        // 遍历原数组，更新每个数字的频数，开始位置和结束位置
        for (int i = 0; i < nums.size(); i++) {
            counter[nums[i]]++;
            start[nums[i]] = (start[nums[i]] == -1) ? i : start[nums[i]];
            end[nums[i]] = i;

            if (counter[nums[i]] > maxCount) {
                // 如果出现了比当前最大频数更大的数字
                maxCount = counter[nums[i]];
                maxNumber.clear();
                maxNumber.insert(nums[i]);
            } else if (counter[nums[i]] == maxCount) {
                // 如果出现了和当前最大频数相同的数字
                maxNumber.insert(nums[i]);
            }
        }

        // 遍历频数最大的数字，寻找开始位置和结束位置距离最小的数字
        int minLength = 50001;
        for (int num : maxNumber) {
            int length = end[num] - start[num];
            minLength = (length < minLength) ? length : minLength;
        }

        return (minLength + 1);
    }
};
// @lc code=end
